tg-me.com/pyproglib/6663
Last Update:
🎯 Команда дня: `@overload` в Python@overload
из модуля typing
позволяет указать несколько сигнатур для одной функции. Это особенно полезно, когда возвращаемый тип зависит от аргументов — и вы хотите, чтобы типизация отражала это поведение.
Пример:
from typing import Literal, overload
@overload
def transform(data: str, mode: Literal["split"]) -> list[str]: ...
@overload
def transform(data: str, mode: Literal["upper"]) -> str: ...
def transform(data: str, mode: Literal["split", "upper"]) -> list[str] | str:
return data.split() if mode == "split" else data.upper()
—
transform(..., "split")
→ list[str]
—
transform(..., "upper")
→ str
— Типизация подскажет ошибку, если вы вызовете
append()
у строки или .lower()
у спискаДругой кейс — когда нужен только один аргумент из двух:
@overload
def get_user(id: int = ..., username: None = None) -> User: ...
@overload
def get_user(id: None = None, username: str = ...) -> User: ...
def get_user(id: int | None = None, username: str | None = None) -> User: ...
Так можно добиться:
get_user(id=1)
get_user(username="John")
get_user(id=1, username="John")
— не соответствует ни одной сигнатуреБонус:
Literal
позволяет ограничить значения аргументов строками:def set_color(color: Literal["red", "blue", "green"]) -> None: ...
Библиотека питониста #буст